home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / sound / 2203intf.c < prev    next >
C/C++ Source or Header  |  2000-04-04  |  4KB  |  173 lines

  1. #include <math.h>
  2. #include "driver.h"
  3. #include "ay8910.h"
  4. #include "fm.h"
  5.  
  6.  
  7. static int stream[MAX_2203];
  8.  
  9. static const struct YM2203interface *intf;
  10.  
  11. static void *Timer[MAX_2203][2];
  12.  
  13. /* IRQ Handler */
  14. static void IRQHandler(int n,int irq)
  15. {
  16.     if(intf->handler[n]) intf->handler[n](irq);
  17. }
  18.  
  19. /* Timer overflow callback from timer.c */
  20. static void timer_callback_2203(int param)
  21. {
  22.     int n=param&0x7f;
  23.     int c=param>>7;
  24.  
  25.     Timer[n][c] = 0;
  26.     YM2203TimerOver(n,c);
  27. }
  28.  
  29. /* update request from fm.c */
  30. void YM2203UpdateRequest(int chip)
  31. {
  32.     stream_update(stream[chip],0);
  33. }
  34.  
  35. #if 0
  36. /* update callback from stream.c */
  37. static void YM2203UpdateCallback(int chip,void *buffer,int length)
  38. {
  39.     YM2203UpdateOne(chip,buffer,length);
  40. }
  41. #endif
  42.  
  43. /* TimerHandler from fm.c */
  44. static void TimerHandler(int n,int c,int count,double stepTime)
  45. {
  46.     if( count == 0 )
  47.     {    /* Reset FM Timer */
  48.         if( Timer[n][c] )
  49.         {
  50.              timer_remove (Timer[n][c]);
  51.             Timer[n][c] = 0;
  52.         }
  53.     }
  54.     else
  55.     {    /* Start FM Timer */
  56.         double timeSec = (double)count * stepTime;
  57.  
  58.         if( Timer[n][c] == 0 )
  59.         {
  60.             Timer[n][c] = timer_set (timeSec , (c<<7)|n, timer_callback_2203 );
  61.         }
  62.     }
  63. }
  64.  
  65. static void FMTimerInit( void )
  66. {
  67.     int i;
  68.  
  69.     for( i = 0 ; i < MAX_2203 ; i++ )
  70.     {
  71.         Timer[i][0] = Timer[i][1] = 0;
  72.     }
  73. }
  74.  
  75. int YM2203_sh_start(const struct MachineSound *msound)
  76. {
  77.     int i;
  78.  
  79.     if (AY8910_sh_start(msound)) return 1;
  80.  
  81.     intf = msound->sound_interface;
  82.  
  83.     /* Timer Handler set */
  84.     FMTimerInit();
  85.     /* stream system initialize */
  86.     for (i = 0;i < intf->num;i++)
  87.     {
  88.         int volume;
  89.         char name[20];
  90.         sprintf(name,"%s #%d FM",sound_name(msound),i);
  91.         volume = intf->mixing_level[i]>>16; /* high 16 bit */
  92.         stream[i] = stream_init(name,volume,Machine->sample_rate,i,YM2203UpdateOne/*YM2203UpdateCallback*/);
  93.     }
  94.     /* Initialize FM emurator */
  95.     if (YM2203Init(intf->num,intf->baseclock,Machine->sample_rate,TimerHandler,IRQHandler) == 0)
  96.     {
  97.         /* Ready */
  98.         return 0;
  99.     }
  100.     /* error */
  101.     /* stream close */
  102.     return 1;
  103. }
  104.  
  105. void YM2203_sh_stop(void)
  106. {
  107.     YM2203Shutdown();
  108. }
  109.  
  110. void YM2203_sh_reset(void)
  111. {
  112.     int i;
  113.  
  114.     for (i = 0;i < intf->num;i++)
  115.         YM2203ResetChip(i);
  116. }
  117.  
  118.  
  119.  
  120. READ_HANDLER( YM2203_status_port_0_r ) { return YM2203Read(0,0); }
  121. READ_HANDLER( YM2203_status_port_1_r ) { return YM2203Read(1,0); }
  122. READ_HANDLER( YM2203_status_port_2_r ) { return YM2203Read(2,0); }
  123. READ_HANDLER( YM2203_status_port_3_r ) { return YM2203Read(3,0); }
  124. READ_HANDLER( YM2203_status_port_4_r ) { return YM2203Read(4,0); }
  125.  
  126. READ_HANDLER( YM2203_read_port_0_r ) { return YM2203Read(0,1); }
  127. READ_HANDLER( YM2203_read_port_1_r ) { return YM2203Read(1,1); }
  128. READ_HANDLER( YM2203_read_port_2_r ) { return YM2203Read(2,1); }
  129. READ_HANDLER( YM2203_read_port_3_r ) { return YM2203Read(3,1); }
  130. READ_HANDLER( YM2203_read_port_4_r ) { return YM2203Read(4,1); }
  131.  
  132. WRITE_HANDLER( YM2203_control_port_0_w )
  133. {
  134.     YM2203Write(0,0,data);
  135. }
  136. WRITE_HANDLER( YM2203_control_port_1_w )
  137. {
  138.     YM2203Write(1,0,data);
  139. }
  140. WRITE_HANDLER( YM2203_control_port_2_w )
  141. {
  142.     YM2203Write(2,0,data);
  143. }
  144. WRITE_HANDLER( YM2203_control_port_3_w )
  145. {
  146.     YM2203Write(3,0,data);
  147. }
  148. WRITE_HANDLER( YM2203_control_port_4_w )
  149. {
  150.     YM2203Write(4,0,data);
  151. }
  152.  
  153. WRITE_HANDLER( YM2203_write_port_0_w )
  154. {
  155.     YM2203Write(0,1,data);
  156. }
  157. WRITE_HANDLER( YM2203_write_port_1_w )
  158. {
  159.     YM2203Write(1,1,data);
  160. }
  161. WRITE_HANDLER( YM2203_write_port_2_w )
  162. {
  163.     YM2203Write(2,1,data);
  164. }
  165. WRITE_HANDLER( YM2203_write_port_3_w )
  166. {
  167.     YM2203Write(3,1,data);
  168. }
  169. WRITE_HANDLER( YM2203_write_port_4_w )
  170. {
  171.     YM2203Write(4,1,data);
  172. }
  173.